'use strict';

// 云对象名：upload-service
module.exports = {
  /**
   * 获取OSS上传Token
   * @param {string} fileType - 文件类型
   * @param {string} fileName - 文件名
   * @param {string} userId - 用户ID
   * @param {string} token - 用户token
   * @returns {object} 上传Token信息
   */
  async getOSSUploadToken(fileType, fileName, userId, token) {
    try {
      const db = uniCloud.database();
      
      // 获取当前用户信息
      let currentUserId = '';
      
      if (userId) {
        currentUserId = userId;
      } else if (token) {
        try {
          const tokenResult = await db.collection('users').where({
            token: token
          }).get();
          
          if (tokenResult.data && tokenResult.data.length > 0) {
            currentUserId = tokenResult.data[0]._id;
          }
        } catch (error) {
          console.error('解析token出错:', error);
        }
      }
      
      if (!currentUserId) {
        return {
          code: -1,
          message: '用户未认证'
        };
      }
      
      if (!fileType || !fileName) {
        return {
          code: -1,
          message: '文件类型和文件名不能为空'
        };
      }
      
      // 验证文件类型
      const allowedTypes = ['image', 'video', 'document', 'audio'];
      if (!allowedTypes.includes(fileType)) {
        return {
          code: -1,
          message: '不支持的文件类型'
        };
      }
      
      // 生成文件路径
      const timestamp = Date.now();
      const randomStr = Math.random().toString(36).substr(2, 9);
      const fileExtension = fileName.split('.').pop();
      const objectKey = `${fileType}/${currentUserId}/${timestamp}_${randomStr}.${fileExtension}`;
      
      // 这里应该调用实际的OSS服务获取上传凭证
      // 由于这是示例代码，我们返回模拟的上传信息
      const uploadInfo = {
        accessKeyId: 'your-access-key-id',
        accessKeySecret: 'your-access-key-secret',
        securityToken: 'your-security-token',
        bucket: 'your-bucket-name',
        region: 'your-region',
        objectKey: objectKey,
        uploadUrl: `https://your-bucket-name.your-region.aliyuncs.com`,
        expiration: new Date(Date.now() + 30 * 60 * 1000), // 30分钟后过期
        policy: 'base64-encoded-policy',
        signature: 'calculated-signature'
      };
      
      // 记录上传请求
      await db.collection('upload_logs').add({
        user_id: currentUserId,
        file_name: fileName,
        file_type: fileType,
        object_key: objectKey,
        status: 'pending',
        create_time: new Date()
      });
      
      return {
        code: 0,
        message: '获取上传凭证成功',
        data: uploadInfo
      };
    } catch (error) {
      console.error('获取OSS上传Token失败:', error);
      return {
        code: -1,
        message: '获取上传凭证失败: ' + error.message
      };
    }
  },

  /**
   * 上传文件
   * @param {string} fileUrl - 文件URL
   * @param {string} fileName - 文件名
   * @param {string} fileType - 文件类型
   * @param {number} fileSize - 文件大小
   * @param {string} userId - 用户ID
   * @param {string} token - 用户token
   * @returns {object} 上传结果
   */
  async uploadFile(fileUrl, fileName, fileType, fileSize, userId, token) {
    try {
      const db = uniCloud.database();
      
      // 获取当前用户信息
      let currentUserId = '';
      
      if (userId) {
        currentUserId = userId;
      } else if (token) {
        try {
          const tokenResult = await db.collection('users').where({
            token: token
          }).get();
          
          if (tokenResult.data && tokenResult.data.length > 0) {
            currentUserId = tokenResult.data[0]._id;
          }
        } catch (error) {
          console.error('解析token出错:', error);
        }
      }
      
      if (!currentUserId) {
        return {
          code: -1,
          message: '用户未认证'
        };
      }
      
      if (!fileUrl || !fileName) {
        return {
          code: -1,
          message: '文件URL和文件名不能为空'
        };
      }
      
      // 保存文件记录
      const fileData = {
        user_id: currentUserId,
        file_name: fileName,
        file_url: fileUrl,
        file_type: fileType || 'unknown',
        file_size: fileSize || 0,
        upload_time: new Date(),
        status: 'uploaded'
      };
      
      const result = await db.collection('uploaded_files').add(fileData);
      
      // 更新上传日志状态
      await db.collection('upload_logs')
        .where({
          user_id: currentUserId,
          file_name: fileName,
          status: 'pending'
        })
        .update({
          status: 'completed',
          file_url: fileUrl,
          complete_time: new Date()
        });
      
      return {
        code: 0,
        message: '文件上传成功',
        data: {
          id: result.id,
          file_url: fileUrl
        }
      };
    } catch (error) {
      console.error('文件上传失败:', error);
      return {
        code: -1,
        message: '文件上传失败: ' + error.message
      };
    }
  }
}; 